From: Colin Walters Date: Wed, 19 Aug 2009 20:55:39 +0000 (-0400) Subject: places: Implement drag&drop for overview X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~11031 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=9dff05a3946efa7364aabc9091f6b9dc6253087c;p=gnome-shell.git places: Implement drag&drop for overview Add drag and drop. We need to be able to recreate the icon texture, so instead of passing it directly into PlaceDisplay, pass a factory function which knows how to create a new texture. --- diff --git a/js/ui/places.js b/js/ui/places.js index 7b90dac07..b122c5d83 100644 --- a/js/ui/places.js +++ b/js/ui/places.js @@ -10,32 +10,61 @@ const Lang = imports.lang; const Mainloop = imports.mainloop; const Signals = imports.signals; +const DND = imports.ui.dnd; const Main = imports.ui.main; const GenericDisplay = imports.ui.genericDisplay; const PLACES_VSPACING = 8; const PLACES_ICON_SIZE = 16; -function PlaceDisplay(name, icon, onActivate) { - this._init(name, icon, onActivate); +/** + * An entry in the places menu. + * @name: String title + * @iconFactory: A JavaScript callback which will create an icon texture + * @onActivate: A JavaScript callback to launch the entry + */ +function PlaceDisplay(name, iconFactory, onActivate) { + this._init(name, iconFactory, onActivate); } PlaceDisplay.prototype = { - _init : function(name, iconTexture, onActivate) { + _init : function(name, iconFactory, onActivate) { this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL, reactive: true, spacing: 4 }); - this.actor.connect('button-press-event', Lang.bind(this, function (b, e) { + this.actor.connect('button-release-event', Lang.bind(this, function (b, e) { onActivate(this); + Main.overview.hide(); })); let text = new Clutter.Text({ font_name: "Sans 14px", ellipsize: Pango.EllipsizeMode.END, color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR, text: name }); let iconBox = new Big.Box({ y_align: Big.BoxAlignment.CENTER }); - iconBox.append(iconTexture, Big.BoxPackFlags.NONE); + this._icon = iconFactory(); + iconBox.append(this._icon, Big.BoxPackFlags.NONE); this.actor.append(iconBox, Big.BoxPackFlags.NONE); this.actor.append(text, Big.BoxPackFlags.EXPAND); + + this._iconFactory = iconFactory; + this._onActivate = onActivate; + + this.actor._delegate = this; + let draggable = DND.makeDraggable(this.actor); + }, + + getDragActorSource: function() { + return this._icon; + }, + + getDragActor: function(stageX, stageY) { + return this._iconFactory(); + }, + + //// Drag and drop methods //// + + shellWorkspaceLaunch : function() { + this._onActivate(); } }; Signals.addSignalMethods(PlaceDisplay.prototype); @@ -59,11 +88,13 @@ Places.prototype = { let homeUri = homeFile.get_uri(); let homeLabel = Shell.util_get_label_for_uri (homeUri); let homeIcon = Shell.util_get_icon_for_uri (homeUri); - let homeTexture = Shell.TextureCache.get_default().load_gicon(homeIcon, PLACES_ICON_SIZE); - let home = new PlaceDisplay(homeLabel, homeTexture, Lang.bind(this, function() { - Main.overview.hide(); - Gio.app_info_launch_default_for_uri(homeUri, Main.createAppLaunchContext()); - })); + let home = new PlaceDisplay(homeLabel, + function() { + return Shell.TextureCache.get_default().load_gicon(homeIcon, PLACES_ICON_SIZE); + }, + function() { + Gio.app_info_launch_default_for_uri(homeUri, Main.createAppLaunchContext()); + }); this._menuBox.append(home.actor, Big.BoxPackFlags.NONE); @@ -79,19 +110,23 @@ Places.prototype = { } if (networkApp != null) { - let networkIcon = networkApp.create_icon_texture(PLACES_ICON_SIZE); - let network = new PlaceDisplay(networkApp.get_name(), networkIcon, Lang.bind(this, function () { - Main.overview.hide(); - networkApp.launch(); - })); + let network = new PlaceDisplay(networkApp.get_name(), + function() { + return networkApp.create_icon_texture(PLACES_ICON_SIZE); + }, + function () { + networkApp.launch(); + }); this._menuBox.append(network.actor, Big.BoxPackFlags.NONE); } - let connectIcon = Shell.TextureCache.get_default().load_icon_name("applications-internet", PLACES_ICON_SIZE); - let connect = new PlaceDisplay('Connect to...', connectIcon, Lang.bind(this, function () { - Main.overview.hide(); - new Shell.Process({ args: ['nautilus-connect-server'] }).run(); - })); + let connect = new PlaceDisplay('Connect to...', + function () { + return Shell.TextureCache.get_default().load_icon_name("applications-internet", PLACES_ICON_SIZE); + }, + function () { + new Shell.Process({ args: ['nautilus-connect-server'] }).run(); + }); this._menuBox.append(connect.actor, Big.BoxPackFlags.NONE); this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), ".gtk-bookmarks"]); @@ -149,11 +184,14 @@ Places.prototype = { if (label == null) continue; let icon = Shell.util_get_icon_for_uri(bookmark); - let iconTexture = Shell.TextureCache.get_default().load_gicon(icon, PLACES_ICON_SIZE); - let item = new PlaceDisplay(label, iconTexture, Lang.bind(this, function() { - Main.overview.hide(); - Gio.app_info_launch_default_for_uri(bookmark, Main.createAppLaunchContext()); - })); + + let item = new PlaceDisplay(label, + function() { + return Shell.TextureCache.get_default().load_gicon(icon, PLACES_ICON_SIZE); + }, + function() { + Gio.app_info_launch_default_for_uri(bookmark, Main.createAppLaunchContext()); + }); this._dirsBox.append(item.actor, Big.BoxPackFlags.NONE); } }